home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 227_01 / egaa.asm < prev    next >
Assembly Source File  |  1988-02-07  |  9KB  |  378 lines

  1.     page    60,132
  2. ;--------------------------------------------------------------------------
  3. ;     e g a a . a s m
  4. ;    ---------------
  5. ;    Low-level driver for the ega device.
  6. ;
  7. ;    update history
  8. ;    --------------
  9. ;    Jun, 17. 1987    "dos.mac" and macro-usage added.
  10. ;
  11. ;    Written by     Rainer Gerhards
  12. ;            Petronellastr. 6
  13. ;            D-5112 Baesweiler
  14. ;            Phone (49) 2401 - 1601
  15. ;--------------------------------------------------------------------------
  16.  
  17.     include    dos.mac
  18.     
  19.     if1
  20.       %out    Info: EGA driver selected.
  21.     endif
  22.  
  23. LONG    macro    bed, ziel        ; conditional jump >  127 byte
  24.     local    l1, l2
  25.     bed    l1
  26.     jmp    short l2
  27. l1:    jmp    ziel
  28. l2:    
  29.     endm
  30.  
  31.     SETX
  32.  
  33. MAX_X    equ    640            ; maximum pixel x
  34. MAX_Y    equ    350            ; maximum pixel y
  35.  
  36.     EXTERN    vidbase,word,VID_BASE
  37.  
  38.     PSEG
  39.     BEGIN    setpixel
  40. ;**
  41. ;    name        setpixel
  42. ;
  43. ;    synopsis    setpixel(x, y, color);
  44. ;            int x, y;    coordinate of the pixel
  45. ;            int color;    pixel-color
  46. ;
  47. ;    description    This function sets a pixel of color "color" at
  48. ;            the specified coordinate.
  49. ;**
  50.     ENTERF
  51.     push    es
  52.     mov    ax, VID_BASE            ; load base adr
  53.     mov    es, ax
  54.     mov    di, [bp]+X            ; load x value
  55.     mov    bx, [bp]+X+2            ; load y value
  56.     cmp    di, MAX_X            ; x range ok?
  57.     jae    sexit
  58.     cmp    bx, MAX_Y            ; y range ok?
  59.     jae    sexit
  60. ;
  61.     mov    cx, bx
  62.     shl    bx, 1                ;  2 *
  63.     shl    bx, 1                ;  4 *
  64.     add    bx, cx                ;  5 *
  65.     shl    bx, 1                ; 10 *
  66.     shl    bx, 1                ; 20 *
  67.     shl    bx, 1                ; 40 *
  68.     shl    bx, 1                ; 80 * = y-byteoffset
  69.     mov    cx, di
  70.     rept    3
  71.     shr    cx, 1                ; x / 8 = x-byteoffset
  72.     endm
  73.     add    bx, cx                ; total byteoffset
  74. ;
  75.     mov    cx, di                ; load x value
  76.     and    cl, 07h                ; x mod 8
  77.     xor    cl, 07h                ; shiftcount = 7 - x mod 8
  78.     mov    ch, 1                ; mask
  79.     shl    ch, cl                ; shift mask to position
  80.  
  81.     mov    dx, 03ceh
  82.     mov    al, 05
  83.     out    dx, al                ; mode register
  84.     inc    dx
  85.     mov    al, 2
  86.     out    dx, al                ; write mode 2
  87.  
  88.     dec    dx
  89.     mov    al, 8
  90.     out    dx, al                ; bit mask register
  91.     inc    dx
  92.     mov    al, ch
  93.     out    dx, al                ; store mask
  94.  
  95.     mov    al, es:[bx]
  96.     mov    ax, [bp]+X+4            ; load color
  97.     mov    es:[bx], al            ; write pixel
  98.  
  99.     mov    dx, 03ceh
  100.     mov    al, 5
  101.     out    dx, al                ; mode register
  102.     inc    dx
  103.     xor    al, al
  104.     out    dx, al                ; write mode 0
  105.  
  106.     dec    dx
  107.     mov    al, 8
  108.     out    dx, al                ; bit mask register
  109.     inc    dx
  110.     mov    al, 0ffh            ; allow access to all bits
  111.     out    dx, al
  112. sexit:    pop    es                ; done!
  113.     LEAVEF
  114.     ENDFUNC    setpixel
  115.  
  116.     BEGIN    setewm2
  117. ;**
  118. ;    name        setwm2
  119. ;
  120. ;    synopsis    setwm2()
  121. ;
  122. ;    description    The ega knows 4 different write modes. The write-pixel
  123. ;            routine uses write mode 2. After changing the write
  124. ;            mode, die default mode (0) must be restored. So the
  125. ;            write pixel routine has first to change the write mode
  126. ;            to 2, write the pixel and then restore write-mode 0.
  127. ;            This is very slow, if you've to write a lot of pixel.
  128. ;            This routine (and rsestdwm) allows the higer-level
  129. ;            routine to set write mode 2 at the beginning of her
  130. ;            processing, to call qsetpix (which assumes that mode 2
  131. ;            is set) to write the pixel and then restore the write-
  132. ;            mode to the default by calling rsestdwm. Because
  133. ;            qsetpix must'nt perform mode-switches, it is much
  134. ;            faster than setpix.
  135. ;    caution        When using this method, the write mode isn't restored
  136. ;            until the higher-level drawing procedure hasn't
  137. ;            finished. If this procedure would be aborted, the BIOS
  138. ;            will not restore the ega registers. So the video-
  139. ;            output will destroyed (display only grabbage). To
  140. ;            recover from this situation, just restore the original
  141. ;            ega register contents. This can by done by a little
  142. ;            program, calling only rsestdwm.
  143. ;**
  144.     mov    dx, 03ceh
  145.     mov    al, 05
  146.     out    dx, al                ; mode register
  147.     inc    dx
  148.     mov    al, 2
  149.     out    dx, al                ; write mode 2
  150.     ret
  151.     ENDFUNC    setewm2
  152.  
  153.     BEGIN    rsestdwm
  154. ;**
  155. ;    name        rsestdwm
  156. ;
  157. ;    synopsis    rsestdwm()
  158. ;
  159. ;    description    This routine restores the ega standard write mode.
  160. ;            For a deteiled discussion see function setewm2.
  161. ;**
  162.     mov    dx, 03ceh
  163.     mov    al, 5
  164.     out    dx, al                ; mode register
  165.     inc    dx
  166.     xor    al, al
  167.     out    dx, al                ; write mode 0
  168.  
  169.     dec    dx
  170.     mov    al, 8
  171.     out    dx, al                ; bit mask register
  172.     inc    dx
  173.     mov    al, 0ffh            ; allow access to all bits
  174.     out    dx, al
  175.     ret
  176.     ENDFUNC    rsestdwm
  177.  
  178.     BEGIN    qsetpix
  179. ;**
  180. ;    name        qsetpix
  181. ;
  182. ;    synopsis    qsetpix(x, y, color);
  183. ;            int x, y;    coordinate of the pixel
  184. ;            int color;    pixel-color
  185. ;
  186. ;    description    This function sets a pixel of color "color" at
  187. ;            the specified coordinate, switching no write modes.
  188. ;            For a deteiled discussion see function setewm2.
  189. ;**
  190.     ENTERF
  191.     push    es
  192.     mov    ax, VID_BASE            ; load base adr
  193.     mov    es, ax
  194.     mov    di, [bp]+X            ; load x value
  195.     mov    bx, [bp]+X+2            ; load y value
  196.     cmp    di, MAX_X            ; x range ok?
  197.     jae    qsexit
  198.     cmp    bx, MAX_Y            ; y range ok?
  199.     jae    qsexit
  200. ;
  201.     mov    cx, bx
  202.     shl    bx, 1                ;  2 *
  203.     shl    bx, 1                ;  4 *
  204.     add    bx, cx                ;  5 *
  205.     shl    bx, 1                ; 10 *
  206.     shl    bx, 1                ; 20 *
  207.     shl    bx, 1                ; 40 *
  208.     shl    bx, 1                ; 80 * = y-byteoffset
  209.     mov    cx, di
  210.     rept    3
  211.     shr    cx, 1                ; x / 8 = x-byteoffset
  212.     endm
  213.     add    bx, cx                ; total byteoffset
  214. ;
  215.     mov    cx, di                ; load x value
  216.     and    cl, 07h                ; x mod 8
  217.     xor    cl, 07h                ; shiftcount = 7 - x mod 8
  218.     mov    ch, 1                ; mask
  219.     shl    ch, cl                ; shift mask to position
  220.  
  221.     mov    dx, 03ceh
  222.     mov    al, 8
  223.     out    dx, al                ; bit mask register
  224.     inc    dx
  225.     mov    al, ch
  226.     out    dx, al                ; store mask
  227.  
  228.     mov    al, es:[bx]
  229.     mov    ax, [bp]+X+4            ; load color
  230.     mov    es:[bx], al            ; write pixel
  231.  
  232. qsexit:    pop    es                ; done!
  233.     LEAVEF
  234.     ENDFUNC    qsetpix
  235.  
  236. readbit    macro
  237.     local    endmac
  238.     mov    al, 4
  239.     out    dx, al
  240.     inc    dx
  241.     mov    al, ah
  242.     out    dx, al
  243.     mov    al, es:[bx]
  244.     shl    cl, 1
  245.     and    al, ch
  246.     jz    endmac
  247.     or    cl, 1
  248. endmac:
  249.     endm
  250.  
  251.     BEGIN    qgetpix
  252. ;**
  253. ;    name        getpix
  254. ;
  255. ;    synopsis    color = qgetpix(x, y);
  256. ;            int x, y;    coordinate of the pixel
  257. ;            int color;    returned color of that pixel
  258. ;
  259. ;    description    This function reads ("gets") the color of a
  260. ;            specified pixel.
  261. ;**
  262.     ENTERF
  263.     push    es
  264.     mov    ax, VID_BASE            ; load base adr
  265.     mov    es, ax
  266.     mov    di, [bp]+X            ; load x value
  267.     mov    bx, [bp]+X+2            ; load y value
  268.     cmp    di, MAX_X            ; x range ok?
  269.     jl    nxt
  270.     jmp    gexit
  271. nxt:    cmp    bx, MAX_Y            ; y range ok?
  272.     jl    proces
  273.     jmp    gexit
  274. ;
  275. proces:    mov    cx, bx
  276.     shl    bx, 1                ;  2 *
  277.     shl    bx, 1                ;  4 *
  278.     add    bx, cx                ;  5 *
  279.     shl    bx, 1                ; 10 *
  280.     shl    bx, 1                ; 20 *
  281.     shl    bx, 1                ; 40 *
  282.     shl    bx, 1                ; 80 * = y-byteoffset
  283.     mov    cx, di
  284.     rept    3
  285.     shr    cx, 1                ; x / 8 = x-byteoffset
  286.     endm
  287.     add    bx, cx                ; total byteoffset
  288. ;
  289.     mov    cx, di                ; load x value
  290.     and    cl, 07h                ; x mod 8
  291.     xor    cl, 07h                ; shiftcount = 7 - x mod 8
  292.     mov    ch, 1                ; mask
  293.     shl    ch, cl                ; shift mask to position
  294.  
  295.     mov    ah, 3
  296.     mov    dx, 03ceh
  297. ;
  298.     rept    4
  299.     readbit
  300.     dec    dx
  301.     dec    ah
  302.     endm
  303. ;
  304.     and    cx, 000fh
  305.     mov    ax, cx
  306. gexit:    pop    es                ; done, retval in ax!
  307.     LEAVEF
  308.     ENDFUNC    qgetpix
  309.  
  310.     BEGIN    setbyte
  311. ;**
  312. ;    name        setbyte
  313. ;
  314. ;    synopsis    setbyte(x, y, color, pattern);
  315. ;            int x;        x-coordinate of the byte, only
  316. ;                    valid if multiple of 8
  317. ;            int y;        y-coordinate of the byte, may have
  318. ;                    any y-value
  319. ;            int color;    pixel-color
  320. ;            int gr_byte;    graphics pattern to set
  321. ;
  322. ;    description    This function puts the graphics pattern contained
  323. ;            in gr_byte into the adapter memory. Gr_byte must
  324. ;            be a multiple of 8, all other values are invalid
  325. ;            and will be rounded. Gr_byte is defined as con-
  326. ;            secutive 8 pixles on the x-axis, which do all have
  327. ;            the SAME color.
  328. ;
  329. ;    warning        This function is only available with the ega driver. 
  330. ;            There is a nearly identic function in the hercules
  331. ;            driver, but It schould be treated as available 
  332. ;            internal to the grphics library only. If you have to 
  333. ;            use it, use conditional compilation, too. This 
  334. ;            function is only available when 
  335. ;            #ifdef EGAGRAF == true!
  336. ;**
  337.     ENTERF
  338.     push    es
  339.     mov    ax, VID_BASE            ; load base adr
  340.     mov    es, ax
  341.     mov    di, [bp]+X            ; load x value
  342.     mov    bx, [bp]+X+2            ; load y value
  343.     cmp    di, MAX_X            ; x range ok?
  344.     jae    sbexit
  345.     cmp    bx, MAX_Y            ; y range ok?
  346.     jae    sbexit
  347. ;
  348.     mov    cx, bx
  349.     shl    bx, 1                ;  2 *
  350.     shl    bx, 1                ;  4 *
  351.     add    bx, cx                ;  5 *
  352.     shl    bx, 1                ; 10 *
  353.     shl    bx, 1                ; 20 *
  354.     shl    bx, 1                ; 40 *
  355.     shl    bx, 1                ; 80 * = y-byteoffset
  356.     mov    cx, di
  357.     rept    3
  358.     shr    cx, 1                ; x / 8 = x-byteoffset
  359.     endm
  360.     add    bx, cx                ; total byt